﻿#pragma once
#include "OgreFrame.h"
#include "OgreFrameListener.h"
#include "UISystem.h"
#include "..\3rdLib\Ogitor\Ogitors.h"
#include "WinSystem.h"

_NAMESPACE_BEGIN


/// Ogre的帧监听类

class NatRacingFrameListener : public OGREFrameListener, public OIS::MouseListener, public OIS::KeyListener
{
public:
	
	/// 构造
	/// \param[in] win 渲染窗口
	/// \param[in] cam 摄像机
	/// \param[in] renderer CEGUI的渲染器
	NatRacingFrameListener(RenderWindow* win, Camera* cam, CEGUI::Renderer* renderer);

	/// Tell the frame listener to exit at the end of the next frame
	void requestShutdown(void);
	
	bool frameEnded(const FrameEvent& evt);

	/// OIS调用的鼠标移动事件的回调函数
	bool mouseMoved(const OIS::MouseEvent &arg);

	/// OIS调用的鼠标按下事件的回调函数
	bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id);

	/// OIS调用的鼠标按钮释放事件的回调函数
	bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
	
	/// OIS调用的键盘按下事件的回调函数
	bool keyPressed( const OIS::KeyEvent &arg );

	///OIS调用的键盘释放后事件的回调函数
	bool keyReleased( const OIS::KeyEvent &arg );

protected:

	/// CEGUI的渲染器
	CEGUI::Renderer* mGUIRenderer;
	bool mShutdownRequested;
};

/// Ogre的高层渲染框架类，在主函数中直接创建和使用
class NatRacingApp : public OGREApplication
{
public:
	NatRacingApp()
	{
	}

	~NatRacingApp()
	{
	}

protected:

	/// 创建Ogre的场景管理器
	virtual void chooseSceneManager(void);

	/// 创建摄像机
	virtual void createCamera(void);

	/// 创建场景
	void createScene(void);

	/// 摧毁场景
	void destroyScene(void);

	/// 创建帧监听器
	void createFrameListener(void);

	/// 配置Ogre的启动
	bool configure(void);

	///加载资源
	void loadResources();
	

protected:

	///OgitorSystem对象，用以加载dll插件
	CWinSystem           *m_System;

	/// Ogitor对象
	Ogitors::OgitorsRoot *ogRoot;

};

_NAMESPACE_END